// falta:

// programar las búsqueda con selección de combos


/* Ingeniería - Editar componente patrón - Selección */

package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_EditarComponentePatronSeleccion extends Composite {
	
	private String tituloTab;
	TabPanel padre;
	
	private ListBox claseCombo;
	private ListBox subclaseCombo;
	private ListBox componenteCombo;
	private ListBox subcomponenteCombo;
	
	private FlexTable componentesFT;
	
	private Button filtrarBtn;
	private Button editarComponenteBtn;
	
	//columnas para la tabla componentes
	private static final int CHECK = 0;
	private static final int COL_CODIGO = 1;
	private static final int COL_COMPONENTE = 2;
	private static final int COL_SUBCOMPONENTE = 3;
	private static final int COL_PLANO = 4;
	private static final int COL_ULTIMA_VERSION = 5;
	private static final int COL_MAS_INFO = 6;
	
	private final String NO_EXISTEN_CLASES = "NO EXISTEN CLASES";
	private final String TODAS_LAS_CLASES = "TODAS LAS CLASES";
	private final String TODAS_LAS_SUBCLASES = "TODAS LAS SUBCLASES";
	private final String TODOS_LOS_COMPONENTES = "TODOS LOS COMPONENTES";
	private final String TODOS_LOS_SUBCOMPONENTES = "TODOS LOS SUBCOMPONENTES";
	
	private IngenieriaServiceAsync ingenieriaService;
	
	public P_EditarComponentePatronSeleccion(TabPanel padre, String titulo) {
		
		this.tituloTab = titulo;
		this.padre = padre;
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "620px");
		
		/////////////// SECCIÓN FILTRADO
		
		Label filtrarPorLabel = new Label("FILTROS");
		filtrarPorLabel.setStyleName("labelTitulo");
		layoutPanel.add(filtrarPorLabel);
		layoutPanel.setWidgetLeftWidth(filtrarPorLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(filtrarPorLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label claseLabel = new Label("CLASE DE EQUIPO:");
		claseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseLabel);
		layoutPanel.setWidgetLeftWidth(claseLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseLabel, 80.0, Unit.PX, 19.0, Unit.PX);
		
		// LISTA DESPLEGABLE CLASE DE EQUIPO.
		
		claseCombo = new ListBox();
		layoutPanel.add(claseCombo);
		layoutPanel.setWidgetLeftWidth(claseCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseCombo, 75.0, Unit.PX, 32.0, Unit.PX);
		
		claseCombo.addChangeHandler(new ChangeHandler() {

			@Override
			public void onChange(ChangeEvent event) {
				
				String itemSeleccionado = claseCombo.getItemText(claseCombo.getSelectedIndex());
				
				subclaseCombo.setEnabled(false);
				subclaseCombo.clear();
				
				componenteCombo.setEnabled(false);
				componenteCombo.clear();
				
				subcomponenteCombo.setEnabled(false);
				subcomponenteCombo.clear();
				
				// si se selecciona una clase específica.
				if (!itemSeleccionado.equals(TODAS_LAS_CLASES)) {
					
					subclaseCombo.clear();
					componenteCombo.clear();
					subcomponenteCombo.clear();
					
					// se toma el código de la clase.
					int codigoClase = Integer.parseInt(itemSeleccionado.split(" ")[0]);
					
					// se carga la lista desplegable de subclases, para la clase seleccionada.
					cargarComboSubclases(codigoClase);
					subclaseCombo.setEnabled(true);
				}
			}
		});		
		
		//
		
		Label subclaseLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseLabel);
		layoutPanel.setWidgetLeftWidth(subclaseLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseLabel, 80.0, Unit.PX, 19.0, Unit.PX);
		
		// LISTA DESPLEGABLE SUBCLASE DE EQUIPO.
		
		subclaseCombo = new ListBox();
		layoutPanel.add(subclaseCombo);
		layoutPanel.setWidgetLeftWidth(subclaseCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseCombo, 75.0, Unit.PX, 32.0, Unit.PX);
		
		subclaseCombo.addChangeHandler(new ChangeHandler() {

			@Override
			public void onChange(ChangeEvent event) {
				
				String itemSeleccionado = subclaseCombo.getItemText(subclaseCombo.getSelectedIndex());
				
				componenteCombo.setEnabled(false);
				componenteCombo.clear();
				
				subcomponenteCombo.setEnabled(false);
				subcomponenteCombo.clear();
				
				// si se selecciona una subclase específica.
				if (!itemSeleccionado.equals(TODAS_LAS_SUBCLASES)) {
					
					componenteCombo.clear();
					subcomponenteCombo.clear();
					
					// se toma el código de la clase.
					int codigoClase = Integer.parseInt(claseCombo.getItemText(claseCombo.getSelectedIndex()).split(" ")[0]);
					
					// se toma el código de la subclase.
					int codigoSubclase = Integer.parseInt(itemSeleccionado.split(" ")[0]);
					
					// se carga la lista desplegable de componentes, para la subclase seleccionada.
					cargarComboComponentes(codigoClase, codigoSubclase);
					componenteCombo.setEnabled(true);
				}
			}
		});		
		
		//
		
		Label componenteLabel = new Label("COMPONENTE:");
		componenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		componenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(componenteLabel);
		layoutPanel.setWidgetLeftWidth(componenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteLabel, 125.0, Unit.PX, 19.0, Unit.PX);
		
		// LISTA DESPLEGABLE COMPONENTES.
		
		componenteCombo = new ListBox();
		layoutPanel.add(componenteCombo);
		layoutPanel.setWidgetLeftWidth(componenteCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteCombo, 120.0, Unit.PX, 32.0, Unit.PX);
		
		componenteCombo.addChangeHandler(new ChangeHandler() {

			@Override
			public void onChange(ChangeEvent event) {
				
				String itemSeleccionado = componenteCombo.getItemText(componenteCombo.getSelectedIndex());
				
				subcomponenteCombo.setEnabled(false);
				subcomponenteCombo.clear();
				
				// si se selecciona un componente específico.
				if (!itemSeleccionado.equals(TODOS_LOS_COMPONENTES)) {
					
					subcomponenteCombo.clear();
					
					// se toma el código de la clase.
					int codigoClase = Integer.parseInt(claseCombo.getItemText(claseCombo.getSelectedIndex()).split(" ")[0]);
					
					// se toma el código de la subclase.
					int codigoSubclase = Integer.parseInt(subclaseCombo.getItemText(subclaseCombo.getSelectedIndex()).split(" ")[0]);
					
					// se carga la lista desplegable de subcomponentes, para el componente seleccionado.
					cargarComboSubcomponentes(codigoClase, codigoSubclase);
					subcomponenteCombo.setEnabled(true);
				}
			}
		});		
		
		//
				
		Label subcomponenteLabel = new Label("SUBCOMPONENTE:");
		subcomponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subcomponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subcomponenteLabel);
		layoutPanel.setWidgetLeftWidth(subcomponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subcomponenteLabel, 125.0, Unit.PX, 19.0, Unit.PX);
		
		// LISTA DESPLEGABLE SUBCOMPONENTES
		
		subcomponenteCombo = new ListBox();
		layoutPanel.add(subcomponenteCombo);
		layoutPanel.setWidgetLeftWidth(subcomponenteCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subcomponenteCombo, 120.0, Unit.PX, 32.0, Unit.PX);
		
		// botón FILTRAR		
		
		filtrarBtn = new Button("BUSCAR");
		layoutPanel.add(filtrarBtn);
		layoutPanel.setWidgetLeftWidth(filtrarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(filtrarBtn, 170.0, Unit.PX, 28.0, Unit.PX);
		
		filtrarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				// se desactiva el botón mientras se ejecuta la orden.
				filtrarBtn.setEnabled(false);
				
				// primero se eliminan las filas.
				int cantidadFilasEliminar = componentesFT.getRowCount() - 1;
				for (int i=cantidadFilasEliminar; i > 0 ; i--) {
					componentesFT.removeRow(i);
				}
								
				// se cargan los componentes patrón de acuerdo a los parámetros seleccionados.
				cargarComponentesPatron();
				
				// se vuelve a activar el botón.
				filtrarBtn.setEnabled(true);
			}
		});
		//
		
		////////////////// SECCIÓN COMPONENTES
		
		Label componenteTituloLabel = new Label("COMPONENTES PATRÓN");
		componenteTituloLabel.setStyleName("labelTitulo");
		layoutPanel.add(componenteTituloLabel);
		layoutPanel.setWidgetLeftWidth(componenteTituloLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteTituloLabel, 200.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel componentesSP = new ScrollPanel();
		componentesSP.setStyleName("tabla");
		layoutPanel.add(componentesSP);
		layoutPanel.setWidgetLeftWidth(componentesSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componentesSP, 260.0, Unit.PX, 250.0, Unit.PX);
		
		componentesFT = new FlexTable();
		componentesSP.setWidget(componentesFT);
		componentesFT.setSize("100%", "100%");
		
		// se carga el encabezado de la tabla.
		// columna CHECK (sirve para saber qué fila está seleccionada)
		componentesFT.setText(0, CHECK, "");
		componentesFT.getCellFormatter().setWidth(0, CHECK, "4%");
		
		// columna CÓDIGO
		componentesFT.setText(0, COL_CODIGO, "CÓDIGO");
		componentesFT.getCellFormatter().setWidth(0, COL_CODIGO, "20%");
		
		// columna COMPONENTE
		componentesFT.setText(0, COL_COMPONENTE, "COMPONENTE");
		componentesFT.getCellFormatter().setWidth(0, COL_COMPONENTE, "25%");
						
		// columna SUBCOMPONENTE
		componentesFT.setText(0, COL_SUBCOMPONENTE, "SUBCOMPONENTE");
		componentesFT.getCellFormatter().setWidth(0, COL_SUBCOMPONENTE, "25%");
		
		// columna PLANO
		componentesFT.setText(0, COL_PLANO, "PLANO");
		componentesFT.getCellFormatter().setWidth(0, COL_PLANO, "9%");
		
		//columna ÚLTIMA VERSIÓN
		componentesFT.setText(0, COL_ULTIMA_VERSION, "ÚLTIMA VERSIÓN");
		componentesFT.getCellFormatter().setWidth(0, COL_ULTIMA_VERSION, "9%");
		
		// columna MÁS INFORMACIÓN
		componentesFT.setText(0, COL_MAS_INFO, "+ INFO");
		componentesFT.getCellFormatter().setWidth(0, COL_MAS_INFO, "8%");
		
		// se setea el estilo a los encabezados
		componentesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		/////////////// SECCIÓN PIE
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 510.0, Unit.PX, 50.0, Unit.PX);
		
		// botón EDITAR EQUIPO PATRÓN
		
		editarComponenteBtn = new Button("EDITAR");
		layoutPanel.add(editarComponenteBtn);
		layoutPanel.setWidgetRightWidth(editarComponenteBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(editarComponenteBtn, 22.0, Unit.PX, 28.0, Unit.PX);
		
		editarComponenteBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				String codigoComponenteSeleccionado = componenteSeleccionado();
				
				// si no hay ningún componente patrón seleccionado.
				if (codigoComponenteSeleccionado.equals("-1")) {
					Window.alert("Seleccione un componente o subcomponente patrón.");
				}
				
				else {
					editarComponentePatron(codigoComponenteSeleccionado);
				}
			}
		});
		
		/// botón SALIR
		
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(salirBtn, 22.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir(event);
			}
		});
		
		/// CARGA DE LOS DATOS DE LA PANTALLA
		cargarDatosPantalla();	
		///
	}
	
	/** 
	 * Método que carga la lista desplegable de clases.
	 */
	private void cargarDatosPantalla() {
	
		// se carga la lista desplegable de clases
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>() {
			
			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> listaClasesEquipoPatronDTO) {

				// si aún no se han creado ninguna clase de equipo patrón, se deshabilitan las opciones correspondientes
				if (listaClasesEquipoPatronDTO.isEmpty()) {
					
					claseCombo.setEnabled(false);
					claseCombo.addItem(NO_EXISTEN_CLASES);
					subclaseCombo.setEnabled(false);
					componenteCombo.setEnabled(false);
					subcomponenteCombo.setEnabled(false);
					
					filtrarBtn.setEnabled(false);
					editarComponenteBtn.setEnabled(false);					
				}
				
				else {
				
					// ítem que permite buscar todos los componentes patrón.
					claseCombo.addItem(TODAS_LAS_CLASES);
					
					// se agregan las clases.
					for(ClaseEquipoPatronDTO claseEquipoPatronDTO: listaClasesEquipoPatronDTO) {
						
						// se agrega como ítem al código de la clase
						claseCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
					}
					
					// como el ítem seleccionado por default es TODAS LAS CLASES, se desactivan el resto de las listas desplegables, hasta tanto no se vayan seleccionando las distintas entidades.
					subclaseCombo.setEnabled(false);
					componenteCombo.setEnabled(false);
					subcomponenteCombo.setEnabled(false);
				}
				
				/// CARGA DE LA TABLA DE COMPONENTES PATRÓN (si se tuvo éxito en cargar la lista desplegable de clases, se pasa a cargar los componenetes en la tabla)
				cargarComponentesPatron();
				///
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
	}
	
	/**
	 * Método que carga los componentes patrón en la tabla, de acuerdo a los datos seleccionados en las listas desplegables.
	 */
	private void cargarComponentesPatron () {
		
		String claseSeleccionada = claseCombo.getItemText(claseCombo.getSelectedIndex());
	
		// si existe al menos una clase.
		if (!claseSeleccionada.equals(NO_EXISTEN_CLASES)) {

			int codigoClase = -1;
			int codigoSubclase = -1;
			int codigoComponente = -1;
			int codigoSubcomponente = -1;
			
			// si se selecciona una clase específica, se toma su código.
			if (!claseSeleccionada.equals(TODAS_LAS_CLASES)) {	
				
				codigoClase = Integer.parseInt(claseSeleccionada.split(" ")[0]);

				String subclaseSeleccionada = subclaseCombo.getItemText(subclaseCombo.getSelectedIndex());	
				
				// si se selecciona una subclase específica, se toma su código.
				if (!subclaseSeleccionada.equals(TODAS_LAS_SUBCLASES)) {
					
					codigoSubclase = Integer.parseInt(subclaseSeleccionada.split(" ")[0]);
					
					String componenteSeleccionado = componenteCombo.getItemText(componenteCombo.getSelectedIndex());
					
					// si se selecciona un componente específico, se toma su código.
					if (!componenteSeleccionado.equals(TODOS_LOS_COMPONENTES)) {
						
						codigoComponente = Integer.parseInt(componenteSeleccionado.split(" ")[0]);
						
						String subcomponenteSeleccionado = subcomponenteCombo.getItemText(subcomponenteCombo.getSelectedIndex());
						
						// si se selecciona un subcomponente específico.
						if (!subcomponenteSeleccionado.equals(TODOS_LOS_SUBCOMPONENTES)) {
							codigoSubcomponente = Integer.parseInt(subcomponenteSeleccionado.split(" ")[0]);
						}
					}
				}
			}	
			
			// se buscan los componentes patrón especificados.
			ingenieriaService.buscarComponentesPatronUltimaVersion(codigoClase, codigoSubclase, codigoComponente, codigoSubcomponente, new AsyncCallback<List<ComponentePatronDTO>>() {

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");					
				}

				@Override
				public void onSuccess(List<ComponentePatronDTO> listaComponentesPatronDTO) {

					
					List<ComponentePatronDTO> listaComponentesActivos = new LinkedList<ComponentePatronDTO>();
					
					listaComponentesActivos = filtrarComponentesActivos(listaComponentesPatronDTO);
					
					
					
					for (int i = 0; i < listaComponentesActivos.size(); i++) {
						
						ComponentePatronDTO componente = listaComponentesActivos.get(i);
						
						// columna para selección
						
						RadioButton radioButton = new RadioButton("componente patrón seleccionado","");						
						componentesFT.setWidget(i + 1, CHECK, radioButton);
						componentesFT.getFlexCellFormatter().setHorizontalAlignment(i + 1, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
						
						// columna CÓDIGO
						
						String codigoComponentePatron = Validaciones.rellenarCodigoComponentePatron(componente);						
						componentesFT.setWidget(i + 1, COL_CODIGO, new Label(codigoComponentePatron));
						componentesFT.getCellFormatter().setWordWrap(i+1, COL_CODIGO, true);
						
						// si se trata de un componente (código subcomponente = 0)
						if (componente.getCodigoSubcomponente() == 0) {
							
							// columna COMPONENTE
							
							componentesFT.setWidget(i + 1, COL_COMPONENTE, new Label(componente.getNombre()));
							componentesFT.getCellFormatter().setWordWrap(i+1, COL_COMPONENTE, true);							
						}
						
						// si se trata de un subcomponente
						else {
							
							// columna SUBCOMPONENTE
							
							componentesFT.setWidget(i + 1, COL_SUBCOMPONENTE, new Label(componente.getNombre()));
							componentesFT.getCellFormatter().setWordWrap(i+1, COL_SUBCOMPONENTE, true);
						}
						
						// columna PLANO		
						
						// se da formato al número de plano.
						String plano = (String) (componente.getPlano() < 10 ? "0" + componente.getPlano() : componente.getPlano());
						componentesFT.setWidget(i + 1, COL_PLANO, new Label(plano));
						componentesFT.getCellFormatter().setWordWrap(i+1, COL_PLANO, true);
						
						// columna ÚLTIMA VERSIÓN
						
						componentesFT.setWidget(i + 1, COL_ULTIMA_VERSION, new Label(componente.getNroVersion()));
						componentesFT.getCellFormatter().setWordWrap(i+1, COL_ULTIMA_VERSION, true);

						// columna MÁS INFO
						
						Label info = new Label("");
						info.setSize("16px", "16px");
						info.setStyleName("labelInfo");						
						componentesFT.setWidget(i + 1, COL_MAS_INFO, info);
						componentesFT.getFlexCellFormatter().setHorizontalAlignment(i + 1, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
						
						componentesFT.getRowFormatter().setStyleName(i + 1, "tablaRenglon");
						
						info.addClickHandler(new ClickHandler() {
							public void onClick(ClickEvent event) {
								Cell celda = componentesFT.getCellForEvent(event);
								masInformacionEquipoPatron(celda);
							}
						});
					}
				}		
			});		
		}
			
		// si no existe ningún equipo patrón cargado, se avisa al usuario
		else {
			Window.alert("Aún no se ha cargado ningún equipo patrón.");
		}
	}
	
	private void masInformacionEquipoPatron(Cell celda) {	
		
		String codigoComponente = componentesFT.getText(celda.getRowIndex(), COL_CODIGO);
		
		final P_DetalleComponentePatron popUp = new P_DetalleComponentePatron(codigoComponente);
		popUp.setGlassEnabled(true);
		popUp.center();
		popUp.show();
	}
	
	/**
	 *  Método que carga la lista desplegable de subclases de equipo patrón.
	 */	
	private void cargarComboSubclases (int codigoClase) {
		
		ingenieriaService.buscarSubclasesEquipoPatron(codigoClase, new AsyncCallback<List<SubclaseEquipoPatronDTO>>() {
			
			@Override
			public void onSuccess(List<SubclaseEquipoPatronDTO> listaSubclasesEquipoPatronDTO) {

				// se carga la opción para mostrar todas las subclases.
				subclaseCombo.addItem(TODAS_LAS_SUBCLASES);
				
				// se cargan las subclases.
				for (SubclaseEquipoPatronDTO subclaseEquipo: listaSubclasesEquipoPatronDTO) {
					subclaseCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipo.getCodigoSubclase()) + " - " +subclaseEquipo.getNombre());
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}	
		});		
	}
	
	/** 
	 * Método que carga la lista desplegable de componentes.
	 */	
	private void cargarComboComponentes (int codigoClase, int codigoSubclase) {
		
		// se buscan todos los componentes y subcomponentes, no repetidos en código
		ingenieriaService.buscarComponentesPatron(codigoClase, codigoSubclase, new AsyncCallback<List<ComponentePatronDTO>>() {
			
			@Override
			public void onSuccess(List<ComponentePatronDTO> listaComponentes) {

				// se carga la opción para mostrar todos los componentes.
				componenteCombo.addItem(TODOS_LOS_COMPONENTES);
				
				// se cargan los componentes.
				for (ComponentePatronDTO c: listaComponentes) {
					
					// si se trata de un componente
					if (c.getCodigoSubcomponente() == 0) {
						componenteCombo.addItem(Validaciones.rellenarCodigo(c.getCodigoComponente()) + " - " + c.getNombre());
					}
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}	
		});		
	}
	
	/** 
	 * Método que carga la lista desplegable de subcomponentes.
	 */	
	private void cargarComboSubcomponentes (int codigoClase, int codigoSubclase) {
		
		// se buscan todos los componentes y subcomponentes, no repetidos en código
		ingenieriaService.buscarComponentesPatron(codigoClase, codigoSubclase, new AsyncCallback<List<ComponentePatronDTO>>() {
			
			@Override
			public void onSuccess(List<ComponentePatronDTO> listaComponentes) {
				
				int codigoComponente = Integer.parseInt(componenteCombo.getItemText(componenteCombo.getSelectedIndex()).split(" ")[0]);

				// se carga la opción para mostrar todos los subcomponentes.
				subcomponenteCombo.addItem(TODOS_LOS_SUBCOMPONENTES);
				
				// se cargan los subcomponentes.
				for (ComponentePatronDTO c: listaComponentes) {
					
					// si se trata de un subcomponente, y si pertenece al componente especificado
					if (c.getCodigoSubcomponente() != 0 && c.getCodigoComponente()  == codigoComponente) {
						subcomponenteCombo.addItem(Validaciones.rellenarCodigo(c.getCodigoSubcomponente()) + " - " + c.getNombre());
					}
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}	
		});		
	}
	
	public String componenteSeleccionado() {
		
		String codigoComponenteSeleccionado = "-1";

		for(int i=1; i < componentesFT.getRowCount() && codigoComponenteSeleccionado.equals("-1"); i++) {
			
			RadioButton radiobutton = (RadioButton) componentesFT.getWidget(i, CHECK);
			
			if(radiobutton.getValue() == true) { 
				codigoComponenteSeleccionado = componentesFT.getText(i, COL_CODIGO);
			}
		}
		
		return codigoComponenteSeleccionado;
	}
	
	public void editarComponentePatron(String codigoComponenteSeleccionado) {
		
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_EditarComponentePatron pEditarComponentePatron = new P_EditarComponentePatron(padre, tituloTab, codigoComponenteSeleccionado);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pEditarComponentePatron);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
	
	private List<ComponentePatronDTO> filtrarComponentesActivos (List<ComponentePatronDTO> listaComponentesPatronDTO) {

		List<ComponentePatronDTO> listaComponentesActivos = new LinkedList<ComponentePatronDTO>();
		
		for (ComponentePatronDTO c: listaComponentesPatronDTO) {
			
			if (c.isActivo()) {
				listaComponentesActivos.add(c);
			}
		}
		
		return listaComponentesActivos;
	}		
		
	public void salir(ClickEvent event) {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
